home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
System Booster
/
System Booster.iso
/
Texteditors
/
XDME
/
Src
/
Var
/
SmallSPC.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-26
|
18KB
|
812 lines
/******************************************************************************
MODUL
smallspc.c
DESCRIPTION
minimal interface for special variables
setting and reading
NOTES
look into future/...
BUGS
none known
TODO
entries for all new spcvars
join the 3 functions into 1
create a list that is scanned in a loop
EXAMPLES
SEE ALSO
vars.c
INDEX
HISTORY
21 Nov 92 null created
28-07-94 null added "$version"
*!***************************************************************************
*!
*! Special Variables - Overview
*!
*! these are some builtin variables, which represent some
*! more or less important things in XDME's interna
*! since some of them are build via functions, not each of them
*! is writable through the variable interface; however all of them
*! should be readable via the variable interface
*!
*! this is the list of the currently supported Special variables
*!
*! ascii
*! autoindent
*! autosplit
*! autounblock
*! activetofront
*! bgpen
*! bbpen
*! colno
*! currentline
*! currentword
*! cursorpen
*! debug
*! fgpen
*! filename
*! findstr
*! fname
*! fpath
*! globalsearch
*! hgpen
*! ignorecase
*! infixmode
*! insertmode
*! keytable
*! lineno
*! margin
*! menustrip
*! modified
*! parcol
*! qualifiers
*! refpaths
*! repstr
*! restofline
*! rexxport
*! savetabs
*! scanf
*! tabstop
*! textnames
*! tpen
*! viewmode
*! wordwrap
*! windowcycling
*! version
*!
******************************************************************************/
/**************************************
Includes
**************************************/
#include "defs.h"
/**************************************
Globale Variable
**************************************/
Prototype char* GetSpecialVar (char* Name);
Prototype char* GetSpecialInt (char* Name);
Prototype char* GetSpecialFlag(char* Name);
Prototype char SetSpecialFlag(char* Name, char* Value);
Prototype char SetSpecialInt (char* Name, char* Value);
Prototype char SetSpecialVar (char* Name, char* Value);
Prototype void do_togglespecialflag(void);
Prototype void do_setspecialvar(void);
extern UBYTE Fstr[];
extern UBYTE Rstr[];
/**************************************
Interne Defines & Strukturen
**************************************/
const char* N_ascii = "ascii";
const char* N_autoindent = "autoindent";
const char* N_autosplit = "autosplit";
const char* N_autounblock = "autounblock";
const char* N_activetofront = "activetofront";
const char* N_bgpen = "bgpen";
const char* N_bbpen = "bbpen";
const char* N_colno = "colno";
const char* N_currentline = "currentline";
const char* N_currentword = "currentword";
const char* N_cursorpen = "cursorpen";
const char* N_debug = "debug";
const char* N_fgpen = "fgpen";
const char* N_filename = "filename";
const char* N_findstr = "findstr";
const char* N_fname = "fname";
const char* N_fpath = "fpath";
const char* N_globalsearch = "globalsearch";
const char* N_hgpen = "hgpen";
const char* N_ignorecase = "ignorecase";
const char* N_infixmode = "infixmode";
const char* N_insertmode = "insertmode";
const char* N_keytable = "keytable";
const char* N_lineno = "lineno";
const char* N_margin = "margin";
const char* N_menustrip = "menustrip";
const char* N_modified = "modified";
const char* N_parcol = "parcol";
const char* N_qualifiers = "qualifiers";
const char* N_refpaths = "refpaths";
const char* N_repstr = "repstr";
const char* N_restofline = "restofline";
const char* N_rexxport = "rexxport";
const char* N_savetabs = "savetabs";
const char* N_scanf = "scanf";
const char* N_tabstop = "tabstop";
const char* N_textnames = "textnames";
const char* N_tpen = "tpen";
const char* N_viewmode = "viewmode";
const char* N_wordwrap = "wordwrap";
const char* N_windowcycling = "windowcycling";
const char* N_version = "version";
/**************************************
Interne Variable
**************************************/
/**************************************
Interne Prototypes
**************************************/
Prototype char* current_word (void);
/*
** GetSpecialVar - Get one of the internal special String Vars:
**
** >name == the name of the variable to search for
** <ptr to malloced string
** <NULL == not found or error
*/
char*
GetSpecialVar(char* Name)
{
int i,j;
char* str; /* return */
char* ptr; /* help: if not NULL, anything was found */
str = NULL;
ptr = NULL;
i = 0;
j = 0;
/* printf("Vn=%s\n",Name); */
if ((Name == NULL) || (Name[0] == 0))
{
return(NULL);
} /* if */
/* String Variables */
switch (Name[0])
{
case 'c':
if (strcmp (Name, N_currentline) == 0)
{ /* old */
ptr = Current;
} else
if (strcmp (Name, N_currentword) == 0)
{ /* new */
ptr = current_word();
} /* if */
break;
case 'f':
if (strcmp (Name, N_filename) == 0)
{ /* old */
ptr = Ep->name;
} else
if (strcmp (Name, N_fname) == 0)
{ /* old */
ptr = fname(Ep->name);
} else
if (strcmp (Name, N_findstr) == 0)
{ /* old */
ptr = Fstr;
} /* if */
break;
case 'k': /* PATCH_NULL [01 Feb 1993] : added */
if (strcmp (Name, N_keytable) == 0)
{
if (ptr = currenthash()) {
ptr = ((struct Node *)ptr)->ln_Name;
} /* if */
} /* if */
break;
case 'm': /* PATCH_NULL [01 Feb 1993] : added */
if (strcmp (Name, N_menustrip) == 0)
{
if (ptr = currentmenu()) {
ptr = ((struct Node *)ptr)->ln_Name;
} /* if */
} /* if */
break;
case 'r':
if (strcmp (Name, N_repstr) == 0)
{ /* old */
ptr = Rstr;
} else
if (strcmp (Name, N_restofline) == 0)
{
if (Clen>=Ep->column) {
ptr = Current + Ep->column; /* DANGER */
} else {
ptr = Current + Clen;
} /* if */
} /* if */
break;
case 's':
if (strcmp (Name, N_scanf) == 0)
{ /* old */
ptr = String;
} /* if */
break;
case 'v':
if (strcmp (Name, N_version) == 0)
{ /* old */
ptr = version;
} /* if */
break;
default:
break;
} /* switch */
if (ptr != NULL)
{
str = malloc (strlen(ptr)+1);
if (str)
{
strcpy(str, ptr);
return(str);
} else if (*ptr != 0)
{
nomemory();
abort(NULL);
} else
{
return(str);
} /* if */
} /* if */
return(NULL);
} /* GetSpcVar */
/*
** SetSpecialVar - set one of DME's internal special String vars
**
** >Name - name of the variable to modify
** >Value - new value of the variable
** <0 == name not found
** <1 == ok ( also if variable is readonly )
*/
char
SetSpecialVar(char* Name, char* Value)
{
char* ptr;
int len;
if ((Name == NULL) || (Name[0] == 0))
{
return(0);
} /* if */
ptr = NULL;
len = LINE_LENGTH;
/* printf("Vs=%s\n",Name); */
if (strcmp (Name, N_filename) == 0)
{
ptr = Ep->name;
len = 63;
} else
if (strcmp (Name, N_findstr) == 0)
{
ptr = Fstr;
} else
if (strcmp (Name, N_repstr) == 0)
{
ptr = Rstr;
} else
if (strcmp (Name, N_scanf) == 0)
{
ptr = String;
} else
if (strcmp (Name, N_currentline) == 0)
{
abort(1);
} else
if (strcmp (Name, N_currentword) == 0)
{
abort(1);
} else
if (strcmp (Name, N_version) == 0)
{
abort(1);
} else
if (strcmp (Name, N_restofline) == 0)
{
abort(1);
} /* if */
if (ptr)
{
strncpy(ptr, Value, len);
return(1); /* found */
} else
return(0); /* not found */
} /* SetSpecialVar */
/*
** GetSpecialInt - Get one of the internal special Integer Vars:
**
** >name == the name of the variable to search for
** <ptr to malloced string
** <NULL == not found or error
*/
char*
GetSpecialInt(char* Name)
{
int found;
long i;
char* str; /* return */
char buffer[16]; /* help: convert numbers here */
found = 0;
/* printf("In=%s\n",Name); */
if (strcmp (Name, N_ascii) == 0)
{ /* current char */
i = Current[Ep->column];
found = 1;
} else
if (strcmp (Name, N_bbpen) == 0)
{ /* highlight pen */
i = BLOCK_BPEN;
found = 1;
} else
if (strcmp (Name, N_bgpen) == 0)
{ /* background pen */
i = TEXT_BPEN;
found = 1;
} else
if (strcmp (Name, N_colno) == 0)
{ /* current xpos */
i = Ep->column + 1;
found = 1;
} else
if (strcmp (Name, N_fgpen) == 0)
{ /* foreground pen */
i = TEXT_FPEN;
found = 1;
} else
if (strcmp (Name, N_hgpen) == 0)
{ /* highlight pen */
i = BLOCK_FPEN;
found = 1;
} else
if (strcmp (Name, N_lineno) == 0)
{ /* current ypos */
i = Ep->line + 1;
found = 1;
} else
if (strcmp (Name, N_margin) == 0)
{ /* right margin for wordwrap */
i = Ep->config.margin;
found = 1;
} else
if (strcmp (Name, N_parcol) == 0)
{ /* left margin of paragraph? */
i = Ep->config.wwcol;
found = 1;
} else
if (strcmp (Name, N_tpen) == 0)
{ /* title bar rendering */
i = TITLE_BPEN;
found = 1;
} else
if (strcmp (Name, N_tabstop) == 0)
{
i = Ep->config.tabstop;
found = 1;
} /* if */
if (found)
{
sprintf(buffer,"%ld",i);
str = malloc(strlen(buffer)+1);
if (str)
{
strcpy(str, buffer);
return(str);
} else
{
nomemory();
abort(NULL);
} /* if */
} /* if */
return(NULL);
} /* GetSpecialInt */
/*
* GetSpecialFlag - Get one of the internal special Flags:
*
* >name == the name of the variable to search for
* <ptr to malloced string
* <NULL == not found or error
*/
char*
GetSpecialFlag(char* Name)
{
char i,found;
char* str; /* return */
char buffer[4]; /* help: convert numbers here */
/* printf("Fn=%s\n",Name); */
found = 0;
/* locals */
if (strcmp (Name, N_autounblock) == 0)
{
i = Ep->config.autounblock ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_autoindent) == 0)
{
i = Ep->config.autoindent ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_autosplit) == 0)
{
i = Ep->config.autosplit ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_debug) == 0)
{
i = globalflags.debug ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_infixmode) == 0)
{ /* while searching */
i = Ep->config.ignorecase ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_insertmode) == 0)
{ /* <-> overwrite */
i = Ep->config.insertmode ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_modified) == 0)
{ /* */
i = Ep->modified ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_viewmode) == 0)
{
i = Ep->viewmode ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_wordwrap) == 0)
{
i = Ep->config.wordwrap ? 1 : 0;
found = 1;
} else
/* globals */
if (strcmp (Name, N_activetofront) == 0)
{
i = globalflags.ActivateToFront ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_globalsearch) == 0)
{
i = globalflags.global_search ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_infixmode) == 0)
{ /* <-> prefixmode / math2 */
i = MathInfix ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_savetabs) == 0)
{
i = globalflags.Savetabs ? 1 : 0;
found = 1;
} else
if (strcmp (Name, N_windowcycling) == 0)
{
i = globalflags.Windowcycling ? 1 : 0;
found = 1;
/* aborted */
} /* if */
if (found)
{
sprintf(buffer,"%ld",i);
if (str = strdup(buffer))
{
return(str);
} else
{
nomemory();
abort(NULL);
} /* if */
} /* if */
return(NULL);
} /* GetSpecialFlag */
/*
* SetSpecialInt - Set a special Integer variable
*
* >Name - name of the variable to modify
* >value - new value of the variable
* <0 == name not found or value was no integer
* <1 == name found (also if variable is write only)
*/
char
SetSpecialInt(char* name, char* value)
{
int val;
// char found = 0;
/* printf("Is=%s\n",name); */
if (!is_number(value))
{ /* --- that is not correct but easy */
return(0);
} /* if */
val = atoi(value);
if ((strcmp (name, N_bgpen) == 0) ||
(strcmp (name, N_colno) == 0) ||
(strcmp (name, N_lineno) == 0) ||
(strcmp (name, N_fgpen) == 0) ||
(strcmp (name, N_hgpen) == 0) ||
(strcmp (name, N_tpen) == 0))
{
abort(1);
} else
if (strcmp (name, N_ascii) == 0)
{
if (!Ep->viewmode)
{
Current[Ep->column] = val / LINE_LENGTH;
} /* if */
} else
if (strcmp (name, N_margin) == 0)
{
Ep->config.margin = val % (LINE_LENGTH);
} else
if (strcmp (name, N_parcol) == 0)
{
Ep->config.wwcol = val % (LINE_LENGTH);
} else
if (strcmp (name, N_tabstop) == 0)
{
Ep->config.tabstop = val % (LINE_LENGTH);
} else
{
return(0); /* not found */
} /* if */
return(1); /* found */
} /* SetSpecialInt */
/*
* SetSpecialFlag - Set a specialFlag
*
* >Name - name of the variable to modify
* >value - new value of the variable
* <0 == name not found
* <1 == ok ( also if other error)
*/
char
SetSpecialFlag(char* name, char* value)
{
char* charptr;
char* comment;
char buffer[32];
char* com[2];
charptr = NULL;
comment = NULL;
com[0] = "Off";
com[1] = "On";
#define ChangeBitFlag(name,comment) \
{ \
Ep->config. name = test_arg (value, Ep->config. name ); \
sprintf(buffer,"%s %s ", comment, com[Ep->config. name ]); \
title(buffer); \
return(1); \
}
/* printf("Fs=%s\n",name); */
/* --- local flags */
if (strcmp (name, N_autounblock) == 0)
ChangeBitFlag(autounblock,"Autounblock")
else if (strcmp (name, N_autoindent) == 0)
ChangeBitFlag(autoindent,"Autoindent")
else if (strcmp (name, N_autosplit) == 0)
ChangeBitFlag(autosplit,"Autosplit")
else if (strcmp (name, N_ignorecase) == 0)
{ /* search case <-> ignorecase */
com[0] = "Sensitive";
com[1] = "InSensitive";
ChangeBitFlag(ignorecase,"Case")
}
else if (strcmp (name, N_insertmode) == 0)
/* <-> overwrite text */
ChangeBitFlag(insertmode,"Inset Mode")
else if (strcmp (name, N_wordwrap) == 0)
ChangeBitFlag(wordwrap,"Wordwrap")
/* editor-specific flags */
#undef ChangeBitFlag
#define ChangeBitFlag(name,comment) \
{ \
Ep-> name = test_arg (value, Ep-> name); \
sprintf(buffer,"%s %s ",comment, com[Ep-> name]); \
title(buffer); \
return(1); \
}
else if (strcmp (name, N_viewmode) == 0)
ChangeBitFlag(viewmode,"Viewmode")
else if (strcmp (name, N_modified) == 0)
ChangeBitFlag(modified,"Modified")
/* --- global flags */
#undef ChangeBitFlag
#define ChangeBitFlag(name,comment) \
{ \
globalflags.name = test_arg (value, globalflags.name); \
sprintf(buffer,"%s %s ",comment, com[globalflags.name]); \
title(buffer); \
return(1); \
}
else if (strcmp (name, N_activetofront) == 0)
ChangeBitFlag(ActivateToFront,"Moving Activated Windows To Front")
else if (strcmp (name, N_debug) == 0)
ChangeBitFlag(debug,"Debugging mode")
else if (strcmp (name, N_globalsearch) == 0)
ChangeBitFlag(global_search,"Global Searching")
else if (strcmp (name, N_savetabs) == 0)
/* save tabs or whitespaces */
ChangeBitFlag(Savetabs,"Save tabs")
else if (strcmp (name, N_windowcycling) == 0)
ChangeBitFlag(Windowcycling,"Windowcycling")
#undef ChangeBitFlag
return(0); /* not found */
} /* SetSpecialFlag */
/*
* This function is to be called for all toggling any special flag
* via a command: flagname mode
* The only thing is - the variable must be treated here
*/
void
do_togglespecialflag()
{
if (!SetSpecialFlag(av[0],av[1]))
abort2();
} /* do_togglespecialflag */
/*
* This function might be called for all setting any special var
* via a command: varname mode
* The only thing is - the variable must be treated here
*/
void
do_setspecialvar()
{
if ( !SetSpecialInt(av[0],av[1])
&& !SetSpecialVar(av[0],av[1]) )
abort2();
} /* do_setspecialvar */
/*
** Redefine these names to adjust the used buffers to Your settings
** the commands are 'atomic' so there should be no interference to
** other 'atomic' commands using them.
**
** for XDME changed buffers[0]/buffers[1] to tmp_buffer/tmp_buf2
*/
#define firstbuffer tmp_buffer
/*
* ! $[SPC.]currentword
* ! that read-only special-variable
* ! represents "the word under the cursor"
* ! that means it finds the beginning of the current word on
* ! on its own (but we do not move the cursor) if cursor is
* ! not within a word, it returns the next word of the line
* ! if there is no next word, an empty string is returned
* ! NOTE this variable is not accessible, if PATCH_VARS is not active
* !
** current_word (uses firstbuffer)
**
** Returns the word under the cursor,
** is used by fastscan and should be used by ref and tag instead of
** their own functions
*/
#define isC(ch) (isalnum((ch)) || (ch) == '_')
char * current_word (void)
{
register char * str;
register int i,j;
str = (char *)firstbuffer;
i = Ep->column;
while ((i>0) && isC(Current[i]))
{ /* goto beginning of word */
i--;
} /* while */
while ((Current[i]) && !isC(Current[i]))
{ /* skip spaces and other garbage */
i++;
} /* while */
j = 0;
while (isC(Current[i]) && (j <= LINE_LENGTH))
{
str[j] = Current[i]; /* copy "word" into buffer */
j++;
i++;
} /* while */
str[j] = 0;
return (str);
} /* current_word */
/******************************************************************************
***** ENDE smallspc.c
******************************************************************************/